package es.tikitaka.actions.equipos;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jooreports.templates.DocumentTemplateException;
import net.sf.jooreports.templates.ZippedDocumentTemplate;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.DocumentFormatRegistry;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;

import es.tikitaka.domain.equipo.Equipo;
import es.tikitaka.domain.equipo.PartEquipo;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("exportEquipo")
@Scope(ScopeType.CONVERSATION)
public class ExportarFichaEquipoAction {

	private ZippedDocumentTemplate z;
	private StringBuffer temporada;
	private String nombre;
	private StringBuffer fundacion;
	private List<String> palmares;
	private List<String> plantilla;

	/**
	 * Constructor por defecto
	 */
	public ExportarFichaEquipoAction() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para generar un pdf con los datos del equipo
	 * 
	 * @param equipo
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public int exportFichaEquipoPdf(Equipo equipo) {

		Map map = new HashMap();

		List<PartEquipo> participaciones = new ArrayList<PartEquipo>();
		participaciones.addAll(equipo.getM_participaciones());
		Collections.sort(participaciones);

		PartEquipo participacion = participaciones
				.get(participaciones.size() - 1);

		// Creamos las variables
		temporada = new StringBuffer();
		nombre = new String();
		fundacion = new StringBuffer();

		// Rellenamos los datos del jugador para añadirlo a la plantilla
		temporada.append("Temporada ").append(
				participacion.getTemporada().getAnio().getAnio());
		nombre = equipo.getNombre();
		fundacion.append(equipo.getFundacion().getAnio());

		// Añadimos los datos al map
		map.put("temporada", temporada);
		map.put("nombre", nombre);
		map.put("fundacion", fundacion);

		// Cogemos la plantilla odt
		URL uri = this.getClass().getClassLoader().getResource(
				"plantillas/fichaEquipo.odt");
		File file = null;

		try {
			file = new File(uri.toURI());
		} catch (URISyntaxException e1) {
			e1.printStackTrace();
		}

		try {
			// connect to an OpenOffice.org instance running on port 8100
			String host = ResourceBundle.getBundle("openoffice").getString(
					"host");
			int port = Integer.parseInt(ResourceBundle.getBundle("openoffice")
					.getString("port"));
			OpenOfficeConnection connection = new SocketOpenOfficeConnection(
					host, port);
			connection.connect();

			ByteArrayOutputStream out = new ByteArrayOutputStream();

			z = new ZippedDocumentTemplate(file);

			z.createDocument(map, out);
			byte[] b = out.toByteArray();

			// convert
			DocumentConverter converter = new StreamOpenOfficeDocumentConverter(
					connection);

			DocumentFormatRegistry registry = new DefaultDocumentFormatRegistry();
			DocumentFormat odt = registry.getFormatByFileExtension("odt");
			DocumentFormat pdf = registry.getFormatByFileExtension("pdf");

			ByteArrayOutputStream outpdf = new ByteArrayOutputStream();

			ByteArrayInputStream in = new ByteArrayInputStream(b);
			converter.convert(in, odt, outpdf, pdf);
			byte[] bpdf = outpdf.toByteArray();

			connection.disconnect();

			FacesContext faces = FacesContext.getCurrentInstance();
			HttpServletResponse response = (HttpServletResponse) faces
					.getExternalContext().getResponse();

			String pdfname = "\"FichaEquipo.pdf\"";
			response.setContentType("application/pdf");
			response.setContentLength(bpdf.length);
			response.setHeader("Content-disposition", "attachment; filename="
					+ pdfname);
			ServletOutputStream desc = response.getOutputStream();
			desc.write(bpdf);

			faces.responseComplete();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("No se puede abrir el archivo");
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Error de I/O");
			e.printStackTrace();
		} catch (DocumentTemplateException e) {
			// TODO Auto-generated catch block
			System.out.println("Error en la plantilla");
			e.printStackTrace();
		}

		return 0;

	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return
	 */
	public StringBuffer getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(StringBuffer temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * 
	 * @return
	 */
	public StringBuffer getFundacion() {
		return fundacion;
	}

	/**
	 * 
	 * @param fundacion
	 */
	public void setFundacion(StringBuffer fundacion) {
		this.fundacion = fundacion;
	}

	/**
	 * 
	 * @return
	 */
	public List<String> getPalmares() {
		return palmares;
	}

	/**
	 * 
	 * @param palmares
	 */
	public void setPalmares(List<String> palmares) {
		this.palmares = palmares;
	}

	/**
	 * 
	 * @return
	 */
	public List<String> getPlantilla() {
		return plantilla;
	}

	/**
	 * 
	 * @param plantilla
	 */
	public void setPlantilla(List<String> plantilla) {
		this.plantilla = plantilla;
	}

}
